package top.jiangqiang.qianyi.common.jackson;


import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
import lombok.extern.slf4j.Slf4j;
import org.dromara.hutool.extra.spring.SpringUtil;
import top.jiangqiang.qianyi.common.constants.http.Error400Status;
import top.jiangqiang.qianyi.common.crypto.EncryptService;
import top.jiangqiang.qianyi.common.exception.Error400Exception;

import java.io.IOException;

/**
 * 注意：json反序列化注解只对body中的参数生效，因为只有body中的json字符串会使用jackson进行反序列化
 * 如果要对get提交的参数进行解密，需要手动解密，此时NotBlank之类的参数校验也无法正常使用。
 * Vo类中需要加密的字段使用注解注释 @JsonSerialize(using = EncryptionSerializer.class)
 * Dto类中需要解密的字段使用注解注释 @JsonDeserialize(using = EncryptionDeserializer.class)
 * 反序列化时解密
 */
@Slf4j
public class EncryptionDeserializer extends StdDeserializer<String> {

    public EncryptionDeserializer() {
        super(String.class);
    }

    public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        String encryptedValue = p.getValueAsString();
        try {
            return SpringUtil.getBean(EncryptService.class).httpDecrypt(encryptedValue);
        } catch (Exception var5) {
            log.error("EncryptionDeserializer failed， decryptionValue:{}", encryptedValue);
            throw new Error400Exception(Error400Status.BAD_REQUEST_DECRYPTION_FAILED);
        }
    }
}
